package com.lsh.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.lsh.entity.User;
import com.lsh.repository.UserRepository;
import com.lsh.service.UserService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

/**
 * @author ：LiuShihao
 * @date ：Created in 2021/3/8 9:23 上午
 * @desc ：
 *
 * com.alibaba.dubbo.config.annotation.Service 注解暴露服务 是dubbo包下的
 *
 * @EnableDubboApiDocs: 配制注解, 启用 dubbo api docs 功能
 * @ApiModule: 类注解, dubbo接口模块信息,用于标注一个接口类模块的用途
 * value: 模块名称
 * apiInterface: 提供者实现的接口
 * version: 模块版本
 * @ApiDoc: 方法注解, dubbo 接口信息,用于标注一个接口的用途
 * value: 接口名称
 * description: 接口描述(可使用html标签)
 * version: 接口版本
 * responseClassDescription: 响应的数据的描述
 * @RequestParam: 类属性/方法参数注解,标注请求参数
 * value: 参数名
 * required: 是否必传参数
 * description: 参数描述
 * example: 参数示例
 * defaultValue: 参数默认值
 * allowableValues: 允许的值,设置该属性后界面上将对参数生成下拉列表
 * 注:使用该属性后将生成下拉选择框
 * boolean 类型的参数不用设置该属性,将默认生成 true/false 的下拉列表
 * 枚举类型的参数会自动生成下拉列表,如果不想开放全部的枚举值,可以单独设置此属性.
 * @ResponseProperty: 类属性注解, 标注响应参数
 * value: 参数名
 * example: 示例
 */

/**
 * @Service(version = "1.0.0") version 指定版本号  实现灰度发布
 */
@Service
//@DubboService
//@ApiModule(value = "UserService", apiInterface = UserServiceImpl.class)
@Component("UserService")
public class UserServiceImpl implements UserService {
//    @ResponseProperty("return a UserRepository")
    @Autowired
    UserRepository userRepository;

    /**
     * 如果服务调用失败会回调hello方法
     * @return
     */

//    @ApiDoc(value = "findAll", responseClassDescription = "查询所有用户数据")
    @HystrixCommand(fallbackMethod = "hello")
    @Override
    public List<User> findAll() {
        System.out.println("UserService8081-findAll");
//        System.out.println("UserService8082-findAll");
        if (Math.random() > 0.5){
            throw new RuntimeException();
        }
        return userRepository.findAll();
    }
//    @ApiDoc(value = "addUser", responseClassDescription = "添加用户")
    @Override
    public void addUser( User user) {
        System.out.println("UserService01-addUser");
        userRepository.save(user);
    }

    @Override
    public void updateUser(User user) {
        System.out.println("UserService01-updateUser");
        userRepository.save(user);
    }

    @Override
    public void delUser(int id) {
        System.out.println("UserService01-delUser");
        userRepository.deleteById(id);
    }

    @Override
    public User findById(Integer id) {
        System.out.println("UserService01-findById");
        return  userRepository.findById(id).get();
    }

    public List<User> hello() {
        System.out.println("Hystrix失败的回调方法Hello");
        return Arrays.asList(new User());
    }
}
